#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h> 
#include <unistd.h>

void error(char *msg);

int main(int argc, char *argv[])
{
	
	int descriptor;
	struct sockaddr_in st_servidor, st_cliente;
	
	/**
	 * Creacion de socket servidor
	 * */
	descriptor = socket(AF_INET, SOCK_STREAM, 0);
    if (descriptor < 0) 
        error("ERROR opening socket");
	
	
	/* Limpieza de la estructura */
	memset(&st_servidor, 0, sizeof( st_servidor ) );
	/* Carga de la familia de direccioens */
	st_servidor.sin_family = AF_INET;
	
	/* Carga del número de puerto */
	st_servidor.sin_port = htons(6211);
	
	/* Carga de dirección IPv4 del socket, asumiendo que
	fue pasado como primer argumento al programa */
	st_servidor.sin_addr.s_addr =INADDR_ANY;
		
	/* Relleno con ceros*/
	bzero ( &(st_servidor.sin_zero), 8);
 
 
 
	/**
	 * Ligar una direccion al socket
	 * */
	int resultado;
	
	resultado = bind( descriptor,(struct sockaddr *) &st_servidor, (socklen_t) sizeof( st_servidor ));
	
	if (resultado< 0){
		error( "bind" );
	}

	
	/**
	 * Espera de clientes
	 * */
	if (listen (descriptor, 1) == -1) 
	{ 
		error("Error\n"); 
	}

	/**
	 * Aceptar clientes
	 * 
	 * */ 
	int descriptor_Cliente; 
	socklen_t longitud_Cliente; 

	longitud_Cliente = sizeof(st_cliente);
     
    descriptor_Cliente = accept (descriptor, (struct sockaddr *) &st_cliente, &longitud_Cliente); 
	if (descriptor_Cliente == -1) 
	{ 
		error ("Error al aceptar cliente\n"); 
	}
	
	
	/*
	 *
	 * SOLO DE PRUEBA 
	 * 
	 */
		
		char buffer[256];
		int n;
		
		bzero(buffer,256);
		n = read(descriptor_Cliente,buffer,255);
		if (n < 0) error("ERROR reading from socket");
		printf("Here is the message: %s\n",buffer);

		n = write(descriptor_Cliente,"I got your message",18);
		if (n < 0) error("ERROR writing to socket");



	close(descriptor);
	
	return 0;
}


void error(char *msg)
{
    perror(msg);
    exit(0);
}
